﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace ProjetoFinal
{
    // Animação
    // Score no Game Over
    // Aumentar a velocidade do macaco e balancear com a da folha
    // Frutas colidindo entre si e colidindo com a HUD
    //o certo seria que aparecer a tela de gameOver

    public class Level1
    {

        static int cont;
        static int time;
        Texture2D scene; // fundo da tela 
        Texture2D preto; // textura para o retangulo, não está sendo usada
        Texture2D life1;
        Texture2D life2;
        Texture2D life3;
        Texture2D monkeyHead;
        Texture2D lifeBox;
        Texture2D HUDbox;
        Leaf leaf;
        Monkey monkey;
        CollisionManager collisionManager;
        Song forestSong;
        public static SoundEffect nextLevel;
        public static int life; // vidas do jogo
        bool lostLife = false;
        List<Texture2D> listofLives = new List<Texture2D>(); // lista de vidas (3)

        int thisLevel; // em qual level eu estou , para usar no draw 
        Random rnd = new Random(); // random para várias coisas (retangulo, case de fruta,)
        
        int drawnFruit; // fruta sorteada
        int drawnRectI; // linha retangulo sorteado
        int drawnRectJ; // coluna retangulo sorteado
        int finalPositionX; // posicao x da fruta no retangulo
        int finalPositionY; // posicao y da fruta no retangulo
        public static bool won; // usada para o draw na classe gameover
        Vector2[,] listPosition;
        bool[,] listEmpty; // lista que auxilia na utilização da lista de retangulos (espaços para a fruta aparecer)
       
        public static int score;// pontos do jogo static ??
        SpriteFont font; // sprite fonte do jogo
        Fruit[] fruits; // array de frutas
    
        public Level1()
        {
        }

        public void Initialize()
        {
            leaf = new Leaf(5, new Rectangle(400, 700, 100, 61), new Rectangle(400, 700, 204, 61));
            monkey = new Monkey(new Rectangle(0, 0, 192, 196), new Rectangle(430, 577, 108, 98), new Vector2(5, 5), 10, 250, 0, 1, 5, new Vector2(192, 196), new Vector2(1197, 196), new Vector2(0, 0));
            collisionManager = new CollisionManager();
            life = 3;
            Manager.levelNow = 1;
            won = false; 
            listPosition = new Vector2[4, 5]; // LISTA DE RETANGULO 2 linhas 4 colunas
            listEmpty = new bool[4, 5];
            Sort();
            fruits = new Fruit[20];

            time = 0;
            cont = 0;
           thisLevel = 1;
            // instancia os retângulos vazios
            for (int i = 0; i < 4; i++)
                for (int j = 0; j < 5; j++)
                    listEmpty[i, j] = true;

            CreateRect(); // cria os retangulos (espaços) na arvore para as frutas aparecerem dentro deles -- TAVA NO UPDATE!!!!

        } 

        public void LoadContent(ContentManager content)
        {
            leaf.LoadContent(content);
            monkey.LoadContent(content);
            scene = content.Load<Texture2D>("scene");
            preto = content.Load<Texture2D>("preto");
            forestSong = content.Load<Song>("ForestSound");
            font = content.Load<SpriteFont>("font");
            lifeBox = content.Load<Texture2D>("lifeBox");
            HUDbox = content.Load<Texture2D>("HUDbox");
            nextLevel = content.Load<SoundEffect>("nextLevel");
            monkeyHead = content.Load<Texture2D>("monkeyHead");

            life1 = content.Load<Texture2D>("life1");
            life2 = content.Load<Texture2D>("life2");
            life3 = content.Load<Texture2D>("life3");
            

            Fruit.c = content;// content para carregar as frutas
        }

        public void Sort()
        {
            drawnFruit = rnd.Next(1, 4); // sorteia a fruta
            drawnRectI = rnd.Next(0, 4); // sorteia a linha entre os  retangulos que a fruta vai aparecer
            drawnRectJ = rnd.Next(0, 5); // sprteia a coluna entre as colunas dos retangulos em que a fruta vai aparecer
            finalPositionX = rnd.Next(0, 200); // sorteia a posição X dentro do retangulo em que a fruta vai aparecer
            finalPositionY = rnd.Next(0, 70); // sorteia a posicao Y dentro do retangulo em que a fruta vai aparecer
        }


        public void Update(KeyboardState nowKeybord, KeyboardState oldKeyboard, GameOver gameOver)
        {
                cont++;

                if (cont == 60)
                {
                    cont = 0;
                    time++;
                }

                if (time == 30 * thisLevel)
                {
                    if (score >= 80) // passou de fase
                    {
                        nextLevel.Play();
                        Manager.nowState = Manager.GameState.Level2; // MUDAR DE NÍVEL
                        
                    }
                    else // perdeu o jogo
                    {
                        Console.WriteLine("Pontos finais:" + score);
                        won = false;
                        Manager.nowState = Manager.GameState.GameOver;

                    }

                }

                if (nowKeybord.IsKeyDown(Keys.Escape))
                    Manager.nowState = Manager.GameState.Quit;

                if (life > 0) // se o jogo ainda nao acabou
                {
                    if (monkey.backtoposition == true)// se tem que voltar pra posição
                    {
                        // para trocar as frutas
                        for (int i = 0; i < fruits.Length; i++)
                            fruits[i] = null;
                        //para modificar os retangulos
                        for (int i = 0; i < 4; i++)
                            for (int j = 0; j < 5; j++)
                                listEmpty[i, j] = true;

                        monkey.backtoposition = false;
                        monkey.BackToPosition(ref life, ref lostLife);
                        leaf.BackToPosition(ref lostLife);
                        


                    }
                }


                if (life == 0)
                {
                    won = false;
                    MediaPlayer.Pause();
                    gameOver.Restart();
                    Manager.nowState = Manager.GameState.GameOver;
                }

                Sort(); // função de sorteio
                monkey.Move();
                leaf.Move(nowKeybord, oldKeyboard);
                collisionManager.Collision(leaf, monkey);

                switch (drawnFruit) // fruta sorteada
                {
                    case 1:
                        if (listEmpty[drawnRectI, drawnRectJ]) // se o retangulo ta vazioo
                        {
                            // Percorre a lista de frutas
                            for (int i = 0; i < fruits.Length; i++)
                            {
                                if (fruits[i] == null)// se a posicao na lista de frutas esta vazia - desenha
                                {
                                    if ((!(finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || !((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))// se a posiçao x e y da fruta não passar da tela 
                                    {
                                        fruits[i] = new Fruit(new Vector2(finalPositionX + listPosition[drawnRectI, drawnRectJ].X, finalPositionY + listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.banana);

                                    }

                                    if (((finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || ((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))  // se passar
                                    {
                                        fruits[i] = new Fruit(new Vector2(finalPositionX - listPosition[drawnRectI, drawnRectJ].X, finalPositionY - listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.banana);
                                    }

                                    i = fruits.Length + 1;
                                }

                            }

                            listEmpty[drawnRectI, drawnRectJ] = false; // posicao na lista de retangulos  preenchida com fruta
                        }



                        break;



                    case 2:

                        if (listEmpty[drawnRectI, drawnRectJ]) // se o retangulo ta vazioo
                        {
                            // Percorre a lista de frutas
                            for (int i = 0; i < fruits.Length; i++)
                            {
                                if (fruits[i] == null)// se a posicao na lista de frutas esta vazia - desenha
                                {
                                    if ((!(finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || !((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))// se a posiçao x e y da fruta não passar da tela 
                                    {
                                        fruits[i] = new Fruit(new Vector2(finalPositionX + listPosition[drawnRectI, drawnRectJ].X, finalPositionY + listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.acai);

                                    }
                                    if (((finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || ((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))  // se passar
                                    {
                                        fruits[i] = new Fruit(new Vector2(finalPositionX - listPosition[drawnRectI, drawnRectJ].X, finalPositionY - listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.acai);
                                    }

                                    i = fruits.Length + 1;

                                }

                            }

                            listEmpty[drawnRectI, drawnRectJ] = false; // posicao na lista de retangulos  preenchida com fruta
                        }


                        break;




                    case 3:

                        if (listEmpty[drawnRectI, drawnRectJ]) // se o retangulo ta vazioo
                        {
                            // Percorre a lista de frutas
                            for (int i = 0; i < fruits.Length; i++)
                            {
                                if (fruits[i] == null)// se a posicao na lista de frutas esta vazia - desenha
                                {
                                    if ((!(finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || !((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))// se a posiçao x e y da fruta não passar da tela 
                                    {
                                        fruits[i] = new Fruit(new Vector2(finalPositionX + listPosition[drawnRectI, drawnRectJ].X, finalPositionY + listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.graviola);

                                    }
                                    if (((finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || ((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))  // se passar
                                    {
                                        fruits[i] = new Fruit(new Vector2(finalPositionX - listPosition[drawnRectI, drawnRectJ].X, finalPositionY - listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.graviola);
                                    }

                                    i = fruits.Length + 1;
                                }
                            }

                            listEmpty[drawnRectI, drawnRectJ] = false; // posicao na lista de retangulos  preenchida com fruta
                        }


                        break;



                    case 4:


                        if (listEmpty[drawnRectI, drawnRectJ]) // se o retangulo ta vazioo
                        {
                            // Percorre a lista de frutas
                            for (int i = 0; i < fruits.Length; i++)
                            {
                                if (fruits[i] == null)// se a posicao na lista de frutas esta vazia - desenha
                                {
                                    if ((!(finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || !((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))// se a posiçao x e y da fruta não passar da tela 
                                    {
                                        fruits[i] = new Fruit(new Vector2(finalPositionX + listPosition[drawnRectI, drawnRectJ].X, finalPositionY + listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.mango);

                                    }
                                    if (((finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || ((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768)) // se passar
                                    {
                                        fruits[i] = new Fruit(new Vector2(finalPositionX - listPosition[drawnRectI, drawnRectJ].X, finalPositionY - listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.mango);
                                    }

                                    i = fruits.Length + 1;
                                }

                            }

                            listEmpty[drawnRectI, drawnRectJ] = false; // posicao na lista de retangulos  preenchida com fruta
                        }


                        break;



                    case 5:

                        if (listEmpty[drawnRectI, drawnRectJ]) // se o retangulo ta vazioo
                        {
                            // Percorre a lista de frutas
                            for (int i = 0; i < fruits.Length; i++)
                            {
                                if (fruits[i] == null)// se a posicao na lista de frutas esta vazia - desenha
                                {
                                    if ((!(finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || !((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))// se a posiçao x e y da fruta não passar da tela 
                                    {
                                        fruits[i] = new Fruit(new Vector2(finalPositionX + listPosition[drawnRectI, drawnRectJ].X, finalPositionY + listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.jackfruit);

                                    }
                                    if (((finalPositionX + listPosition[drawnRectI, drawnRectJ].X > 1024)) || ((finalPositionY + listPosition[drawnRectI, drawnRectJ].Y) > 768))// se passar
                                    {
                                        fruits[i] = new Fruit(new Vector2(finalPositionX - listPosition[drawnRectI, drawnRectJ].X, finalPositionY - listPosition[drawnRectI, drawnRectJ].Y), Fruit.type.jackfruit);
                                    }

                                    i = fruits.Length + 1;

                                }
                            }

                            listEmpty[drawnRectI, drawnRectJ] = false; // posicao na lista de retangulos  preenchida com fruta
                        }
                        break;
                }

                #region Colisao do macaco com as frutas
                // percorre a lista de frutas
                for (int i = 0; i < 20; i++)
                {
                    if (fruits[i] != null) // se a posicao nao esta vazia
                    {
                        if (monkey.rectDestination.Intersects(fruits[i].rectCollision)) // se a fruta e o macaco se tocaram
                        {
                            
                            score += fruits[i].FruitType.GetHashCode(); // soma o ponto da fruta nos pontos do jogo
                            fruits[i] = null;// REMOVER A FRUTA DA POSIÇÃO DA LISTA QUE FOI DESTRUÍDA.

                            // TEM QUE COLOCAR O RETANGULO EM QUE A FRUTA ESTAVA VAZIO TB!!!!
                            listEmpty[(int)(i / 8), (int)(i % 5)] = true; // listEMpty[indice da fruta / 4 (numero de linhas),indice da fruta % 4 (numero de colunas)] - encontra o retangulo que estava com a fruta e o avisa que ele está vazio para receber uma nova fruta
                        }
                    }

                }
                #endregion
            
           
        }
            


        public void CreateRect() // Cria os retangulos na arvore
        {
            for (int i = 0; i < 4; i++)
                for (int j = 0; j < 5; j++)
                    listPosition[i, j] = new Vector2(j * 200 + j, i * 70 + i + 40);


        }
       
        public void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Begin();


                spriteBatch.Draw(scene, new Vector2(0, 0), Color.White);

            leaf.Draw(spriteBatch);
            monkey.Draw(spriteBatch);
            spriteBatch.Draw(lifeBox, new Vector2(813, 0), Color.White);
            spriteBatch.Draw(HUDbox, new Vector2(0, 0), Color.White);
            spriteBatch.DrawString(font, "Pontos: " + (int)score, new Vector2(20, 10), Color.Black);
            spriteBatch.DrawString(font, "Tempo: " + (int)time, new Vector2(200, 10), Color.Black);
            spriteBatch.DrawString(font, "Fase " + thisLevel, new Vector2(400, 10), Color.Black);

            // desenhando os retangulos pretos
            for (int i = 0; i < 4; i++)
                for (int j = 0; j < 5; j++)
                {
                    spriteBatch.Draw(preto, listPosition[i, j] = new Vector2(j * 200 + j, i * 70 + i + 40), Color.White);
                }

            
            // desenhando as frutas
            for (int i = 0; i < fruits.Length; i++)
            {
                    if (fruits[i] != null)
                    fruits[i].Draw(spriteBatch);
                
            }
            // desenhando a vida
            if (life == 3)
            {
                spriteBatch.Draw(life1, new Vector2(960, 10), Color.White);
                spriteBatch.Draw(life2, new Vector2(900, 10), Color.White);
                spriteBatch.Draw(life3, new Vector2(840, 10), Color.White);
            }

            if (life == 2)
            {
                spriteBatch.Draw(life1, new Vector2(960, 10), Color.White);
                spriteBatch.Draw(life2, new Vector2(900, 10), Color.White);
                spriteBatch.Draw(monkeyHead, new Vector2(840, 13), Color.White);

            }

            if (life == 1)
            {
                spriteBatch.Draw(life1, new Vector2(960, 10), Color.White);
                spriteBatch.Draw(monkeyHead, new Vector2(900, 13), Color.White);
                spriteBatch.Draw(monkeyHead, new Vector2(840, 13), Color.White);

            }

            
            spriteBatch.End();
            
        }

        public void Restart()
        {
            life = 3;
            won = false;
            MediaPlayer.Play(forestSong);
            CreateRect(); // cria os retangulos (espaços) na arvore para as frutas aparecerem dentro deles -- TAVA NO UPDATE!
            Sort();
            time = 0;
            cont = 0;
            score = 0;
            thisLevel = 1;
            //para modificar as posições e as frutas 
            for (int i = 0; i < fruits.Length; i++)
                fruits[i] = null;

            //para modificar os retangulos
            for (int i = 0; i < 4; i++)
                for (int j = 0; j < 5; j++)
                    listEmpty[i, j] = true;
           
        }

    }
}
